home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ROADS15.ARJ / TILEIO.C < prev    next >
C/C++ Source or Header  |  1993-12-27  |  6KB  |  179 lines

  1. #define TILEIO_C
  2.  
  3. #include <fastgraf.h>
  4. #include "roads.h"
  5. #include "tiles.h" /* NEEDS ACCESS BECAUSE OF ANIMS */
  6.  
  7. extern int far *topography;      /* BACKGROUND TILE LIST (ARRAY) */
  8. extern int far *terrain;      /* FOREGROUND TILE LIST (ARRAY) */
  9. extern struct ANIMATION *anim_list[ANIM_LIST_TOTAL];
  10.  
  11. int view_x=0, view_y=0;        /* VIEW AREA (UPPER LEFT CORNER) */
  12. int viewpage=0;                /* CURRENTLY VIEWED PAGE */
  13.  
  14. /*
  15.  *
  16.  * Redraws the screen view area.  Returns 1 on successful scroll.
  17.  *
  18.  */
  19. int redraw (int draw_type)
  20. {
  21.     int new_draw_type;
  22.     int pageflip=1;
  23.  
  24.     switch (draw_type)
  25.     {
  26.         case NONFLIP_SCROLL_RIGHT:
  27.             new_draw_type=SCROLL_RIGHT; pageflip=0; break;
  28.         case NONFLIP_SCROLL_LEFT:
  29.             new_draw_type=SCROLL_LEFT; pageflip=0; break;
  30.         case NONFLIP_SCROLL_UP:
  31.             new_draw_type=SCROLL_UP; pageflip=0; break;
  32.         case NONFLIP_SCROLL_DOWN:
  33.             new_draw_type=SCROLL_DOWN; pageflip=0; break;
  34.         case NONFLIP_REFRESH:
  35.             new_draw_type=REFRESH; pageflip=0; break;
  36.         default:
  37.             new_draw_type=draw_type; break;
  38.     }
  39.  
  40.     switch (new_draw_type)
  41.     {
  42.         case REFRESH: /* Full Refresh */
  43.         place_tile_block (0, 0, VIEW_WIDTH-1, VIEW_HEIGHT-1);
  44.         break;
  45.  
  46.         case SCROLL_UP:
  47.         if (view_y<=0) return 0; /* DON'T ALLOW TO SCROLL BEYOND WORLD */
  48.         view_y--;
  49.         fg_transfer (0, SCREEN_WIDTH-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, 0, SCREEN_HEIGHT-1, viewpage, !viewpage);
  50.         place_tile_block (0, 0, VIEW_WIDTH-1, 0);
  51.         break;
  52.  
  53.         case SCROLL_DOWN:
  54.         if (view_y>=WORLD_HEIGHT-VIEW_HEIGHT) return 0; /* HEY! */
  55.         view_y++;
  56.         fg_transfer (0, SCREEN_WIDTH-1, TILE_HEIGHT, SCREEN_HEIGHT-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, viewpage, !viewpage);
  57.         place_tile_block (0, VIEW_HEIGHT-1, VIEW_WIDTH-1, VIEW_HEIGHT-1);
  58.         break;
  59.  
  60.         case SCROLL_LEFT:
  61.         if (view_x<=0) return 0; /* DON'T ALLOW TO SCROLL BEYOND WORLD */
  62.         view_x--;
  63.         fg_transfer (0, SCREEN_WIDTH-TILE_WIDTH-1, 0, SCREEN_HEIGHT-1, TILE_WIDTH, SCREEN_HEIGHT-1, viewpage, !viewpage);
  64.         place_tile_block (0, 0, 0, VIEW_HEIGHT-1);
  65.         break;
  66.  
  67.         case SCROLL_RIGHT:
  68.         if (view_x>=WORLD_WIDTH-VIEW_WIDTH) return 0; /* HEY! */
  69.         view_x++;
  70.         fg_transfer (TILE_WIDTH, SCREEN_WIDTH-1, 0, SCREEN_HEIGHT-1, 0, SCREEN_HEIGHT-1, viewpage, !viewpage);
  71.         place_tile_block (VIEW_WIDTH-1, 0, VIEW_WIDTH-1, VIEW_HEIGHT-1);
  72.         break;
  73.  
  74.         case SCROLL_UR:
  75.         if (view_x>=WORLD_WIDTH-VIEW_WIDTH) return redraw (SCROLL_UP);
  76.         if (view_y<=0) return redraw(SCROLL_RIGHT);
  77.         view_y--;  view_x++;
  78.         fg_transfer (TILE_WIDTH, SCREEN_WIDTH-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, 0, SCREEN_HEIGHT-1, viewpage, !viewpage);
  79.         place_tile_block (0, 0, VIEW_WIDTH-1, 0);
  80.         place_tile_block (VIEW_WIDTH-1, 0, VIEW_WIDTH-1, VIEW_HEIGHT-1);
  81.         break;
  82.  
  83.         case SCROLL_DR:
  84.         if (view_x>=WORLD_WIDTH-VIEW_WIDTH) return redraw(SCROLL_DOWN);
  85.         if (view_y>=WORLD_HEIGHT-VIEW_HEIGHT) return redraw(SCROLL_RIGHT);
  86.         view_y++;  view_x++;
  87.         fg_transfer (TILE_WIDTH, SCREEN_WIDTH-1, TILE_HEIGHT, SCREEN_HEIGHT-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, viewpage, !viewpage);
  88.         place_tile_block (0, VIEW_HEIGHT-1, VIEW_WIDTH-1, VIEW_HEIGHT-1);
  89.         place_tile_block (VIEW_WIDTH-1, 0, VIEW_WIDTH-1, VIEW_HEIGHT-1);
  90.         break;
  91.  
  92.         case SCROLL_DL:
  93.         if (view_x<=0) return redraw (SCROLL_DOWN);
  94.         if (view_y>=WORLD_HEIGHT-VIEW_HEIGHT) return redraw(SCROLL_LEFT);
  95.         view_y++;  view_x--;
  96.         fg_transfer (0, SCREEN_WIDTH-TILE_WIDTH-1, TILE_HEIGHT, SCREEN_HEIGHT-1, TILE_WIDTH, SCREEN_HEIGHT-TILE_HEIGHT-1, viewpage, !viewpage);
  97.         place_tile_block (0, VIEW_HEIGHT-1, VIEW_WIDTH-1, VIEW_HEIGHT-1);
  98.         place_tile_block (0, 0, 0, VIEW_HEIGHT-1);
  99.         break;
  100.  
  101.         case SCROLL_UL:
  102.         if (view_x<=0) return redraw (SCROLL_UP);
  103.         if (view_y<=0) return redraw (SCROLL_LEFT);
  104.         view_y--;  view_x--;
  105.         fg_transfer (0, SCREEN_WIDTH-TILE_WIDTH-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, TILE_WIDTH, SCREEN_HEIGHT-1, viewpage, !viewpage);
  106.         place_tile_block (0, 0, VIEW_WIDTH-1, 0);
  107.         place_tile_block (0, 0, 0, VIEW_HEIGHT-1);
  108.         break;
  109.     }
  110.  
  111.     if (pageflip)
  112.     {
  113.         viewpage=!viewpage; /* SWAP PAGES */
  114.         fg_setvpage (viewpage);
  115.     }
  116.  
  117.     return 1; /* SUCCESSFUL SCROLL */
  118. }
  119.  
  120. /*
  121.  *
  122.  * Redraws a rectangular region of the active (!shown) page with tiles.
  123.  *
  124.  */
  125.  
  126. void place_tile_block (int x1, int y1, int x2, int y2)
  127. {
  128.     register int x, y;
  129.     int tile, a;
  130.  
  131.     for (y=view_y+y1; y<=view_y+y2; y++)
  132.     for (x=view_x+x1; x<=view_x+x2; x++)
  133.     {
  134.         tile=terrain[WORLD_TILE(x,y)];
  135.  
  136.             /* DON'T PLACE FOREGROUND IF EMPTY */
  137.         if (tile==EMPTY_TILE)
  138.             pagecopy_tile_op (topography[WORLD_TILE(x,y)],VIEW_TILE(x-view_x,y-view_y), TILEPAGE, !viewpage);
  139.  
  140.         else
  141.         {
  142.             if (is_anim(tile))
  143.             {
  144.                 a=0;
  145.                 while (anim_list[a]->anm!=tile) a++;
  146.                 tile=anim_list[a]->current;
  147.             }
  148.  
  149.             pagecopy_tile_op (topography[WORLD_TILE(x,y)], VIEW_TILE(x-view_x,y-view_y), TILEPAGE, !viewpage);
  150.             pagecopy_tile_tr (tile, VIEW_TILE(x-view_x,y-view_y), TILEPAGE, !viewpage);
  151.         }
  152.     }
  153. }
  154.  
  155. /*
  156.  *
  157.  * Updates on the visual page a single world tile.
  158.  *
  159.  */
  160. void update_tile (int tile)
  161. {
  162.     register int viewtile;
  163.  
  164.     if (!is_viewable (tile)) return; /* DO NOT UPDATE THE UNSEEN */
  165.  
  166.     viewtile=VIEW_TILE(WORLD_TILE_X(tile)-view_x,WORLD_TILE_Y(tile)-view_y);
  167.  
  168.     if (terrain[tile]==EMPTY_TILE)
  169.         pagecopy_tile_op (topography[tile], viewtile, TILEPAGE, viewpage);
  170.  
  171.     else
  172.     {
  173.         pagecopy_tile_op (topography[tile], MIXING_TILE, TILEPAGE, TILEPAGE);
  174.         pagecopy_tile_tr (terrain[tile], MIXING_TILE, TILEPAGE, TILEPAGE);
  175.         pagecopy_tile_op (MIXING_TILE, viewtile, TILEPAGE, viewpage);
  176.     }
  177. }
  178.  
  179.